import torch
import numpy as np

def t1():
    # 随机5行3列张量
    x = torch.rand(5, 3)
    # 数值全为1的5行3列张量
    y = torch.ones(5, 3)
    print('x:', x)
    print('y:', y)
    print('y.t():', y.t())
    # 张量相加
    z = x + y
    print('z:', z)
    p = x * y
    print('p:', p)
    # 张量相乘，由于乘数的行要与被乘数的列一样，所以用y.t()函数来转换y，最终为5行5列的张量
    q = x.mm(y.t())
    print('q:', q)
    print(torch.cuda.is_available())

def t2():
    # requires_grad: 是否获取梯度信息
    x = torch.ones(2,2,requires_grad=True)
    print('x:', x)
    y = x + 3
    print('y:', y)
    z = y * y
    print('z:', z)
    # z的平均值
    t = torch.mean(z)
    print('t:', t)
    # 获取梯度信息，即求导
    t.backward()
    # PyTorch规定只有叶节点才可以通过".backward()"获取梯度信息，所以这里只有x有值
    # print(z.grad)
    # print(y.grad)
    print('x.grad:', x._grad)

def t3():
    sz = 10
    x = torch.FloatTensor(np.arange(50))
    print('x:', x)
    y = x.expand(sz, len(x))
    print('y:', y)
    print('y.t():', y.t())

if __name__ == '__main__':
    t1()
    # t3()